/*
 * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.spi.protocol;

import org.omg.CORBA.BAD_PARAM;

import com.sun.corba.se.impl.orbutil.ORBUtility;

import com.sun.corba.se.spi.ior.IOR;

import com.sun.corba.se.spi.orb.ORB;

/**
 * Thrown to signal an OBJECT_FORWARD or LOCATION_FORWARD
 */
public class ForwardException extends RuntimeException {

  private ORB orb;
  private org.omg.CORBA.Object obj;
  private IOR ior;

  public ForwardException(ORB orb, IOR ior) {
    super();

    this.orb = orb;
    this.obj = null;
    this.ior = ior;
  }

  public ForwardException(ORB orb, org.omg.CORBA.Object obj) {
    super();

    // This check is done early so that no attempt
    // may be made to do a location forward to a local
    // object.  Doing this lazily would allow
    // forwarding to locals in some restricted cases.
    if (obj instanceof org.omg.CORBA.LocalObject) {
      throw new BAD_PARAM();
    }

    this.orb = orb;
    this.obj = obj;
    this.ior = null;
  }

  public synchronized org.omg.CORBA.Object getObject() {
    if (obj == null) {
      obj = ORBUtility.makeObjectReference(ior);
    }

    return obj;
  }

  public synchronized IOR getIOR() {
    if (ior == null) {
      ior = ORBUtility.getIOR(obj);
    }

    return ior;
  }
}
